/**
 * 这个类是所有游戏对象的基类
 */
let AC_GAME_OBJECTS = [];

class AcGameObject {
    constructor() {
        // 将当前对象添加到AC_GAME_OBJECTS数组中
        AC_GAME_OBJECTS.push(this);

        // 这个变量用来判断是否已经调用过start函数
        this.has_called_start = false;
        // 当前帧距离上一帧的事件间隔，单位ms
        // 因为有的浏览器1s不会调用60次，所以需要这个变量
        // 最好不使用帧率来乘速度，而是使用时间间隔来乘速度
        this.timedelta = 0;
        this.uuid = this.create_uuid();
    }

    create_uuid() {
        let res = "";
        for (let i = 0; i < 8; i ++) {
            // Math.random()返回的是[0, 1)之间的数
            let x = parseInt(Math.floor(Math.random() * 10));
            res += x;
        }
        return res;
    }

    // 只会在第一帧执行一次
    start() {
    }

    // 每一帧都会执行一次
    update() {
    }

    // 当物体被销毁时执行
    // 设计这个函数的好处是，能够在物体被销毁时触发一些操作
    // 而不用修改自己的destroy函数
    on_destroy() {
    }

    // 删除该物体
    destroy() {
        // 当一个物体被销毁时，调用on_destroy函数
        // 这个函数可能会使其他物体加分或触发别的操作
        this.on_destroy();

        for (let i = 0; i < AC_GAME_OBJECTS.length; i ++) {
            // === 表示严格相等
            if (AC_GAME_OBJECTS[i] === this) {
                // 下面的splice表示从i开始删除1个元素
                AC_GAME_OBJECTS.splice(i, 1);
                break;
            }
        }
    }
}

let last_timestamp = 0;
/**
 * 这里声明了一个回调函数，会调用requestAnimationFrame函数
 * @param {在什么时候调用了这个函数} timestamp
 */
let AC_GAME_ANIMATION = function(timestamp) {

    // 遍历所有对象
    for (let i = 0; i < AC_GAME_OBJECTS.length; i ++) {
        let obj = AC_GAME_OBJECTS[i];
        // 如果没有调用过start函数，就调用start函数
        if (!obj.has_called_start) {
            obj.has_called_start = true;
            obj.start();
        } else {
            // 更新时间戳
            // 并且如果已经调用过start函数，就调用update函数
            obj.timedelta = timestamp - last_timestamp;
            obj.update();
        }
    }

    // 更新时间戳
    last_timestamp = timestamp;

    // 所以需要在每次回调的时候重新绑定回调函数
    requestAnimationFrame(AC_GAME_ANIMATION);
}

// 这里相当于是在绑定回调函数，并且绑定一次，执行一次
// 将1s等分为60个事件
// 在每个事件发生的时候执行这个函数
requestAnimationFrame(AC_GAME_ANIMATION);
